#!python3


# 类定义
class people:
    # 定义基本属性
    name = ''
    age = 0
    # 定义私有属性,私有属性在类外部无法直接进行访问
    __weight = 0

    # 定义构造方法
    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.__weight = weight

    # 定义类的方法
    def speak(self):
        print("%s 说: 我 %d 岁, 体重 %d。" % (self.name, self.age, self.__weight))


# 单继承示例：student类继承了people类
class student(people):
    grade = ''

    # 定义构造方法
    def __init__(self, name, age, weight, grade):
        # 调用父类的构造函数
        people.__init__(self, name, age, weight)
        self.grade = grade

    # 覆写父类的方法
    def speak(self):
        print("%s 说: 我 %d 岁了，我在读 %d 年级" % (self.name, self.age, self.grade))


# 另一个类，多重继承之前的准备
class speaker:
    topic = ''
    name = ''

    def __init__(self, name, topic):
        self.name = name
        self.topic = topic

    def speak(self):
        print("我叫 %s，我是一个演说家，我演讲的主题是 %s" % (self.name, self.topic))


# 多重继承：sample类继承了speaker类和student类
class sample(speaker, student):
    a = ''

    def __init__(self, name, age, weight, grade, topic):
        student.__init__(self, name, age, weight, grade)
        speaker.__init__(self, name, topic)


if __name__ == '__main__':
    p = people('jack', 32, 60)
    p.speak()  # 类方法调用

    s = student('ken', 10, 60, 3)
    s.speak()  # 类方法调用
    super(student, s).speak()  # 父类方法调用

    t = sample("Tim", 25, 80, 4, "Python")
    t.speak()  # 如果父类方法有同名，默认调用的是在括号中排在前面的父类的方法
    super(sample, t).speak()  # 用子类对象调用父类已被覆盖的方法
